package comp
{
	use namespace comp_layout;

	import comp.style.css.CssAchieve;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	import flash.net.URLLoader;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequest;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	import flash.utils.Dictionary;

	/**
	 * 图片对象
	 * 可以直接显示网络加载下来的图片
	 */
	public class Image extends UIComponent
	{
		include "style/BorderStyles";//包含样式
		include "style/PaddingStyles";//包含样式
		include "style/Tips" //提示信息
		include "style/SkinStyle" //皮肤属性

		public function Image(src:String="")
		{
			super();
			_themeName="comp::Image"; 
			addEventListener(MouseEvent.MOUSE_OVER,onTipsMouseOver);
			addEventListener(MouseEvent.MOUSE_OUT,onTipsMouseOut);
			mouseChildren=false;
			_loader=new Loader();
			_urlLoader=new URLLoader();
			_src=src;

		}
		
		/**
		 * 清理图片
		 */
		public function clear():void
		{
			this._src="";
			if(this._content && this._content.parent)
				this._content.parent.removeChild(_content);
			_content=null;

		}
		
		//*********** override *************
		override protected function createChildren():void
		{
			/**
			 * 加载的 SWF 文件或图像文件属于您无权访问的安全沙箱。
			 * 对于加载的 SWF 文件，可以避免这种情况的方法是：使该文件调用 Security.allowDomain() 方法，
			 * 或在您调用 load() 或 loadBytes() 方法时使加载文件指定 loaderContext 参数，并将该参数的
			 *  securityDomain 属性设置为 SecurityDomain.currentDomain。*/
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
			_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,IoError);
			_urlLoader.addEventListener(Event.COMPLETE,onURLComplete);
			_urlLoader.addEventListener(IOErrorEvent.IO_ERROR,IoError);
			_urlLoader.dataFormat=URLLoaderDataFormat.BINARY;

			createTipsUI();
		}
		
		override protected function commitProperties():void
		{
			if(this.src)
			{
				if(cache[this.src])
					decode(cache[this.src])
				else
				{
					var url:URLRequest=new URLRequest(src);
					_urlLoader.load(url);
				}
			}
			commitTipsPropertis();
		}
		
		override protected function merge():void
		{
			if(this._content)
			{
				var pl:Number=getStyle("paddingLeft");
				var pt:Number=getStyle("paddingTop");
				var pr:Number=getStyle("paddingRight");
				var pb:Number=getStyle("paddingBottom");
			
				if(this._autoW)
					this._myWidth=_content.width+pl+pr;
				else
					_content.width=this.width-pl-pr;
				
				if(this._autoH)
					this._myHeight=_content.height+pt+pb;
				else
					_content.height=this.height-pt-pb;
				
				this.addChild(_content);
				_content.x=pl;
				_content.y=pt;
			}
			CssAchieve.mergeBackGrounde(this);
			CssAchieve.mergeTemplate(this);
			this.wholeRect=new Rectangle(0,0,this.width,this.height);
		}
		
		override public function dispose():void
		{
			super.dispose();
			if(this._loader)
			{
				_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onComplete);
				_loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,IoError);
			}
			if(_urlLoader)
			{
				_urlLoader.addEventListener(Event.COMPLETE,onURLComplete);
				_urlLoader.addEventListener(IOErrorEvent.IO_ERROR,IoError);
			}
			_urlLoader=null;
			this._loader=null;
			_onLoadComplete=null;
			if(this._content)
				_content=null;
			while(this.numChildren>0)
				this.removeChildAt(0);
			
			if(this.parent)
				this.parent.removeChild(this);
			
		}
		
		//************* 私有方法 ******************
		/**
		 * 网络加载完成
		 */
		private function onURLComplete(e:Event):void
		{
			_data=e.target.data;
			cache[this.src]=_data;
			decode(data);
		}
		
		/**
		 * 解码
		 */
		private function decode(data:*):void
		{
			var lc:LoaderContext=new LoaderContext(false,ApplicationDomain.currentDomain,null);
			if(_loader)
				_loader.loadBytes(data,lc);
		}

		private function onComplete(e:Event):void
		{
			if(_content is Bitmap)
				Bitmap(_content).bitmapData.dispose();
			var loader:Loader=flash.display.LoaderInfo(e.target).loader;			
			_content=loader.content;
			loader.unload();
			this.merge();
			if(this._onLoadComplete!=null)
				_onLoadComplete(this);

		}
		
		/**
		 * 加载出错
		 */
		private function IoError(e:IOErrorEvent):void
		{
			
		}
		
		//*************** 属性 ****************
		/**
		 * 图片 或者 swf URL地址
		 */
		public function get src():String
		{
			return _src;
		}
		
		/**
		 * @private
		 */
		public function set src(value:String):void
		{
			if(_src!=value && value)
			{
				_src = value;
				if(this.initialized)
					commitProperties();
			}
		}
		
		/**
		 * 图片加载完成的时候调用
		 * function(imge:Image):void
		 */
		public function get onLoadComplete():Function
		{
			return _onLoadComplete;
		}
		
		/**
		 * @private
		 */
		public function set onLoadComplete(value:Function):void
		{
			_onLoadComplete = value;
		}
		
		/**
		 * 加载下来的可显示对象
		 */
		public function get content():DisplayObject
		{
			return _content;
		}
		
		/**
		 * 加载的二进制数据
		 */
		public function get data():*
		{
			return _data;
		}
	
		//******************* 私有 *********************
		private var _onLoadComplete:Function;//图片加载完成的时候调用
		private var _src:String;//图片 或者 swf URL地址
		private var _content:DisplayObject;//加载下来的数据
		private var _loader:Loader;//解包器
		private var _urlLoader:URLLoader;//加载器
		private var _data:*;//加载的二进制数据
		private static var cache:Dictionary=new Dictionary();//图片资源缓存
		
		/**
		 * 清楚图片缓存
		 */
		public static function clearCache():void
		{
			for(var k in cache)
			{
				cache[k]=null;				
			}
			cache=new Dictionary();
		}

		

	}
}